#include <applicationTask.h>
#include <ColorMixingTask.h>
#include <lin_device.h>
#include <adc_device.h>
#include <uart_device.h>
#include <gpio_device.h>
#include <linMasterTask.h>

#define UART_FRAME_SIZE 8

UartDataFrame_t dataFrame[UART_FRAME_SIZE];
uint8_t dataFrameIn = 0;
uint8_t dataFrameOut = 0;
UartDataFrame_t currentFrame;
UART_State_t uartState = UART_STATE_WAIT_SOF;
uint8_t uartDataCount = 0;
uint8_t pec = 0;

uint8_t uartISR = 0;
uint8_t uartTimeoutCount = 0;

TaskState_t applState = TASK_STATE_INIT;
void ApplTimerExpired(SoftTimer_t *timer);
void uartReceivedTimerExpired(SoftTimer_t *timer);
uint8_t times=0;
#define FADING_TIME 200

SoftTimer_t ApplTimer = {
    .mode = TIMER_PERIODIC_MODE,
    .interval = FADING_TIME,
    .handler = ApplTimerExpired};

SoftTimer_t uartReceivedTimer = {
    .mode = TIMER_PERIODIC_MODE,
    .interval = 20,
    .handler = uartReceivedTimerExpired};

uint8_t Data[8] = {0, 0, 0, 0, 0, 0, 0, 0};
uint8_t UART_STA = 0;
uint8_t color=0;
void ApplTimerExpired(SoftTimer_t *timer)
{

    color++;
    CLM_SetRGBL(ROOM_TEMPERATURE,LED0, color, 0, 0, 100,FADING_TIME);
    CLM_SetRGBL(ROOM_TEMPERATURE,LED1, 0, color, 0, 100,FADING_TIME);
    CLM_SetRGBL(ROOM_TEMPERATURE,LED2, 0, 0, color, 100,FADING_TIME);
    CLM_SetRGBL(ROOM_TEMPERATURE,LED3, 0, 0, 0, 0,FADING_TIME);
    CLM_SetRGBL(ROOM_TEMPERATURE,LED4, 0, 0, 0, 50,FADING_TIME);
    CLM_SetRGBL(ROOM_TEMPERATURE,LED5, 0, 0, 0, 100,FADING_TIME);

}

void Uart_RX_ISR(uint8_t data)
{
    UART_SendData((uint8_t *)&data, 1);
    Data[UART_STA] = data;
    UART_STA++;
    if (UART_STA == 8)
    {
        UART_STA = 0;
        //UART_SendData(Data, 8);
    }
}

void APPL_TaskHandler(void)
{
    switch (applState)
    {
    case TASK_STATE_INIT:
      applState = TASK_STATE_ACTIVE;
      UART_Init(BAUDRATE_9600, BITSIZE_8BITS, PARITY_NONE,STOPS_1BITS);
      UART_RegisterIRQ(Uart_RX_ISR, NULL);
      //SoftTimer_Start(&ApplTimer);
      times++;
      GPIO_Init(GPIO_PORT_1, GPIO_MUX_GPIO, GPIO_DIR_OUTPUT,GPIO_PULL_MODE_NONE);
      GPIO_Init(GPIO_PORT_2, GPIO_MUX_GPIO, GPIO_DIR_OUTPUT,GPIO_PULL_MODE_NONE);
      GPIO_Init(GPIO_PORT_3, GPIO_MUX_GPIO, GPIO_DIR_OUTPUT,GPIO_PULL_MODE_NONE);
      
      
      GPIO_SetPorts((1 << GPIO_PORT_1) | (1 << GPIO_PORT_2) | (1 << GPIO_PORT_3), 0);
      GPIO_SetPorts((1 << GPIO_PORT_1) | (1 << GPIO_PORT_2) | (1 << GPIO_PORT_3), (1 << GPIO_PORT_1));
      GPIO_SetPorts((1 << GPIO_PORT_1) | (1 << GPIO_PORT_2) | (1 << GPIO_PORT_3), (1 << GPIO_PORT_2));
      GPIO_SetPorts((1 << GPIO_PORT_1) | (1 << GPIO_PORT_2) | (1 << GPIO_PORT_3), (1 << GPIO_PORT_2) | (1 << GPIO_PORT_1));
      
      GPIO_SetPorts((1 << GPIO_PORT_1) | (1 << GPIO_PORT_2) | (1 << GPIO_PORT_3), (1 << GPIO_PORT_3));
      GPIO_SetPorts((1 << GPIO_PORT_1) | (1 << GPIO_PORT_2) | (1 << GPIO_PORT_3), (1 << GPIO_PORT_3) | (1 << GPIO_PORT_1));
      GPIO_SetPorts((1 << GPIO_PORT_1) | (1 << GPIO_PORT_2) | (1 << GPIO_PORT_3), (1 << GPIO_PORT_3) | (1 << GPIO_PORT_2));
      GPIO_SetPorts((1 << GPIO_PORT_1) | (1 << GPIO_PORT_2) | (1 << GPIO_PORT_3), (1 << GPIO_PORT_3) | (1 << GPIO_PORT_2) | (1 << GPIO_PORT_1));
        break;
    case TASK_STATE_ACTIVE:
       // ApplTimerExpired(&ApplTimer);
        break;
    }
}

void uartReceivedTimerExpired(SoftTimer_t *timer)
{
  
}
